package com.baseproject.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

import com.baseproject.BaseApplication;
import com.baseproject.json.JsonUtils;

import java.io.File;

import rx.Observable;

import static com.baseproject.util.FileUtils.getFilePath;

/**
 * 应用的sharedPreferernce
 *
 * @author Administrator
 */
public class PreferencesUtils {
	// 默认sharedPreference的文件名
	public static String PREFERENCE_NAME = "preference";

	private PreferencesUtils() {
		throw new AssertionError();
	}

	/**
	 * 存储字符串到sharedPreference中
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            要存储的key值
	 * @param value
	 *            要存储的value值
	 * @return 是否存储成功
	 */
	public static boolean putString(Context context, String key, String value) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		Editor editor = settings.edit();
		editor.putString(key, value);
		return editor.commit();
	}

	/**
	 * 从sharedPreference中获取string 类型的值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            要获取数据的key值
	 * @return 要获取的数据
	 */
	public static String getString(Context context, String key) {
		return getString(context, key, null);
	}

    /**
     * 从sharedPreference中获取string 类型的值
     *
     * @param context      上下文对象
     * @param key          要获取数据的key值
     * @param defaultValue 默认值
     * @return 要获取的数据
     */
    public static String getString(Context context, String key, String defaultValue) {
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return settings.getString(key, defaultValue);
    }

	/**
	 * 存储int类型的数据到sharedPreference中
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            要存储的key值
	 * @param value
	 *            要存储的value值
	 * @return 是否存储成功
	 */
	public static boolean putInt(Context context, String key, int value) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		Editor editor = settings.edit();
		editor.putInt(key, value);
		return editor.commit();
	}

	/**
	 * 获取sharedPreference中指定key的value值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            key
	 * @return 要获取的value值
	 */
	public static int getInt(Context context, String key) {
		return getInt(context, key, -1);
	}

	/**
	 * 获取sharedPreference中指定key的value值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 * @param defaultValue
	 *            默认值
	 * @return 要获取的value值
	 */
	public static int getInt(Context context, String key, int defaultValue) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		int value = settings.getInt(key, defaultValue);
		if (-1 == value) {
			value = defaultValue;
		}
		return value;
	}

	/**
	 * 存储long类型的数据到sharedPreference中
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            要存储的key值
	 * @param value
	 *            要存储的value值
	 * @return 是否存储成功
	 */
	public static boolean putLong(Context context, String key, long value) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		Editor editor = settings.edit();
		editor.putLong(key, value);
		return editor.commit();
	}

	/**
	 * 获取sharedPreference中指定key的value值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            key
	 * @return 要获取的value值
	 */
	public static long getLong(Context context, String key) {
		return getLong(context, key, -1);
	}

	/**
	 * 获取sharedPreference中指定key的value值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 * @param defaultValue
	 *            默认值
	 * @return 要获取的value值
	 */
	public static long getLong(Context context, String key, long defaultValue) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		return settings.getLong(key, defaultValue);
	}

	/**
	 * 存储float类型的数据到sharedPreference中
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            要存储的key值
	 * @param value
	 *            要存储的value值
	 * @return 是否存储成功
	 */
	public static boolean putFloat(Context context, String key, float value) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		Editor editor = settings.edit();
		editor.putFloat(key, value);

		return editor.commit();
	}

	/**
	 * 获取sharedPreference中指定key的value值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            key
	 * @return 要获取的value值
	 */
	public static float getFloat(Context context, String key) {
		return getFloat(context, key, -1);
	}

	/**
	 * 获取sharedPreference中指定key的value值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 * @param defaultValue
	 *            默认值
	 * @return 要获取的value值
	 */
	public static float getFloat(Context context, String key, float defaultValue) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		return settings.getFloat(key, defaultValue);
	}

	/**
	 * 存储boolean类型的数据到sharedPreference中
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            要存储的key值
	 * @param value
	 *            要存储的value值
	 * @return 是否存储成功
	 */
	public static boolean putBoolean(Context context, String key, boolean value) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		Editor editor = settings.edit();
		editor.putBoolean(key, value);
		return editor.commit();
	}

	/**
	 * 获取sharedPreference中指定key的value值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 *            key
	 * @return 要获取的value值
	 */
	public static boolean getBoolean(Context context, String key) {
		return getBoolean(context, key, false);
	}

	/**
	 * 获取sharedPreference中指定key的value值
	 *
	 * @param context
	 *            上下文对象
	 * @param key
	 * @param defaultValue
	 *            默认值
	 * @return 要获取的value值
	 */
	public static boolean getBoolean(Context context, String key, boolean defaultValue) {
		SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		return settings.getBoolean(key, defaultValue);
	}

	public static int increaseAndGetGroupId(Context context, String key) {
		int saved = PreferencesUtils.getInt(context, key, -1);
		saved++;
		PreferencesUtils.putInt(context, key, saved);
		return saved;
	}

	//////以下为自定义sharedpreferences文件名称的接方法///////////////////

    public static boolean setString(String fileName, String value) {
		FileUtils.writeFile(getFile(fileName), value);
		return true;

		//sharePreference方案：
//        context = (null == context) ? BaseApplication.getApplication().getApplicationContext() : context;
//        return  context.getSharedPreferences(fileName, 0).edit().putString(key, value).commit();
    }

	private static File getFile(String fileName){
		return new File(getFilePath(fileName));
	}

	public static Observable<String> getString(String fileName, String defaultValue) {
		String filePath = getFilePath(fileName);
		if (FileUtils.isFileExist(filePath)) {
			return FileUtils.getStringFromFile(new File(filePath));
		}
		return Observable.just(null);

		//sharePreference方案：
//        context = (null == context) ? BaseApplication.getApplication().getApplicationContext() : context;
//        return  context.getSharedPreferences(fileName, 0)
//                .getString(key, defaultValue);
    }


	public static <T> T getObjectIfFileExists(Context context, String fileName, Class<T> model) {
		context = (null == context) ? BaseApplication.getApplication().getApplicationContext() : context;
		SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, 0);
		if(sharedPreferences != null) {
			return JsonUtils.getInstance().strToModel(sharedPreferences.getString("jsonStr", ""), model);
		} else {
			return null;
		}
	}

}